package base

import (
	"gitee.com/wm1998/infra"
	log "github.com/sirupsen/logrus"
	"github.com/tietang/props/kvs"
	"sync"
)

// 实现了启动器管理器接口的结构体
type PropsStarter struct {
	infra.BaseStarter // 包含infra.BaseStarter接口，目的是可以选择性地实现该接口方法
}

var props kvs.ConfigSource // 资源配置接口，可理解为资源配置文件

// 系统配置不应对外暴露，因此对外提供一个配置的函数，以供外部获取配置实例
func Props() kvs.ConfigSource {
	Check(props)
	return props
}

// 实现了启动器管理器接口的此方法，因在系统启动时，读取配置文件的优先级是最高的，也是应用初始化的第一步
func (p *PropsStarter) Init(ctx infra.StarterContext) {
	props = ctx.Props()
	log.Info("infra/base/props.go - 初始化资源配置实例")
	GetSystemAccount() // 从配置文件中读取红包中间商的红包资金账户配置内容，然后再反序列化输出
}

// 系统红包中间账户配置结构体
type SystemAccount struct {
	AccountNo   string // 红包资金账户编号
	AccountName string // 红包资金账户名
	UserId      string // 红包资金账户用户ID
	Username    string // 红包资金账户用户名
}

var systemAccount *SystemAccount // 系统红包中间账户
var systemAccountOnce sync.Once

// 从系统配置文件中读取系统红包中间账户的配置内容，然后进行反序列化输出
func GetSystemAccount() *SystemAccount {
	systemAccountOnce.Do(func() { // 不论Do()函数被调用多少次，其参数里的匿名函数中的代码都只会执行一次
		systemAccount = new(SystemAccount)
		// 从系统配置文件中读取系统红包中间账户的配置内容，然后进行反序列化，并将反序列化结构设置到systemAccount结构体
		err := kvs.Unmarshal(Props(), systemAccount, "system.account")
		if err != nil {
			panic(err)
		}
	})
	return systemAccount
}

// 从系统配置文件中获取红包活动-活动链接地址
func GetEnvelopeActivityLink() string {
	link := Props().GetDefault("envelope.link", "/v1/envelope/link")
	return link
}

// 从系统配置文件中获取红包活动-活动链接的域名地址
func GetEnvelopeDomain() string {
	domain := Props().GetDefault("envelope.domain", "http://localhost")
	return domain
}
